<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <title>Android Push API instrumentation test page</title>
    <link rel="manifest" href="manifest.json">
  </head>
  <body>
    <!-- This page is used by the PushMessagingTest instrumentation test. -->
    <script src="../notifications/notification_test_utils.js"></script>
    <script>
      // PushMessagingTest observes changes to the tab title as an asynchronous
      // response mechanism from JavaScript to Java.
      // TODO(mvanouwerkerk): Use DomAutomationController - crbug.com/562487
      var errorCounter = 0;
      function sendToTest(message) {
        // Duplicate messages cannot be detected by the test, don't send them.
        if (message == document.title) {
          console.log('Duplicate message: ' + message);
          message =
              'Error ' + errorCounter + ' - duplicate message: ' + message;
          errorCounter++;
        }
        document.title = message;
      }

      // Installs a service worker, subscribes to push, and sets up a messaging
      // mechanism between this page and the service worker. Called by the test.
      function subscribePush() {
        GetActivatedServiceWorker(
            'push_messaging_test_worker_android.js', location.pathname)
            .then(registration =>
              registration.pushManager.subscribe({ userVisibleOnly: true }))
            .then(subscription => {
              setupMessageHandler();
              sendToTest('subscribe ok');
            })
            .catch(error => sendToTest('subscribe fail: ' + error));
      }

      // Sets whether the service worker should show a notification when it
      // receives a push message or not. Called by the test.
      function setNotifyOnPush(notify) {
        sendToServiceWorker('setNotifyOnPush', notify);
      }

      // Sends a message of type |type| with a data payload of |data| to the
      // service worker.
      function sendToServiceWorker(type, data) {
        navigator.serviceWorker.ready
            .then(registration => {
              registration.active.postMessage(
                  JSON.stringify({'type': type, 'data': data}));
            });
      }

      // The data for messages of type sendToTest will be passed to the test.
      function setupMessageHandler() {
        messagePort.addEventListener('message', event => {
          var message = JSON.parse(event.data);
          if (message.type == 'sendToTest') {
            sendToTest(message.data);
          }
        });
      }
    </script>
  </body>
</html>